SeminárioLP-Linguagem Python 2/2014 - Diego Marques e Gabriel Barbosa
Python é uma linguagem de programação orientada a objeto de alto nível e teve seu nome escolhido, apesar de muitas pessoas se confundirem, em homenagem ao grupo Monty Python e ao programa por eles criado Monty Python's Flying Circus. Essa linguagem foi concebida para que os programadores aumentassem sua produtividade, consequentemente, ela precisa ter boa legibilidade. História Seu projeto foi feito por Guido van Rossum em 1991 na Holanda e foi idealizado como um sucessor da ABC (cujo foco está no ensino da programação). A linguagem é capaz de tratar exceções e prover interface com o sistema operacional Amoeba (SO de tempo compartilhado que faz com que um conjunto de computadores em rede comporta-se como uma única máquina). Um dos focos principais, então era aumentar a produtividade do programador. Atualmente possui um modelo open source gerenciado pela Python Software Foundation. Versões: * 0.0.9 | 1991 - estavam presentes classes com herança, tratamento de excessões, funções e os tipos de dado nativos list, dict, str. * 1.0 - ferramentas para programação funcional (lambda, map, filter e reduce). * 1.4 - parâmetros nomeados e suporte a números complexos. * 2.0 - coletor de lixo, list comprehension (criação de lista baseada em listas existentes). * 2.2 - modelo consistentemente orientado a objetos e generator * 2.3 - suporte a arquivos XML. * 3.4.1 - versão atual. Premissas, usuário característico e domínio Premissas: Python é uma linguagem de script, alto nivel, interpretada, orientada a objetos e possui suporte a programação funcional, multiplataforma. Sua filosofia visa a legibilidade sobre a velocidade ou expressividade e rejeita a ideia de ter mais de uma forma de fazer algo. Usuários característicos: Os principais usuários característicos são Google (parte dos crawlers), Yahoo (sitio de grupo de usuários) e NASA. Domínio: Computação gráfica, aplicações web (crawlers), banco de dados (MySQL, PostGreSQL), Programação CGI, Machine Learning. Características Tipos de dados Existem 4 tipos básicos de dados. Todos os outros que também são usados podem ser caracterizados como derivados desses. São os tipos Inteiro, Ponto Flutuante, Complexo e Strings. Inteiros Os números inteiros possuem precisão infinita, já que são implementados em software. Os tipos booleanos e long são derivados desse tipo. Ponto Flutuante Possuem precisão similar ao dado de tipo double na linguagem C. Complexo Apesar de o tipo complexo possuir dois campos, real e imaginário, que são ponto flutuantes, não é um tipo derivado dele. Strings As strings em Python são listas (ver Estruturas de Dados) em que cada caracter ocupa um elemento da lista. Um caracter sozinho é considerado uma string de um único elemento. # Exemplos de variáveis de diversos tipos # Inteiros a = 2 b = 15 d = 0 e = -3 f = 2346285695670298734189730986718902306736 # Ponto Flutuante g = 3.6 h = 2.0 i = 10/3 # String j = 'Uma "string"!' k = "Outra 'string'!" l = """Ufa, acabaram...""" # Complexo m = complex(2,3) m.conjugate() n = 5 n.append('j') Estruturas de Dados Python possue poucas estruturas de dados, mas com elas é possível fazer tudo que se é necessário pois são completas e cobrem diversos casos. As Listas, sequências mutáveis de dados frequentemente homogêneos, as tuplas, sequências imutáveis de dados, podendo ser tanto heterogêneos quanto homogêneos, o r'ange', sequências imutáveis de números, normalmente utilizados para realização do for, os s'ets', coleção mutável de dados não ordenados e não repetidos (frozenset é a versão imutável do set) e os d'icionários', coleção de dados não ordenados do tipo chave : valor, onde chave pode ser qualquer dado, desde que imutável são todos as estruturas de dados presentes nesta linguagem. # Exemplos de Estruturas de dados # Listas a = 2, 3, 4, 5 b = 6.0, 0.02 c = [] d = ["idade", 26 # Tuplas e = ('pi', 3.1415) f = (12345, 5.4321) g = (true, complex(10,1)) # Range h = range(10) # Se chamarmos list(h) receberemos 1,2,3,4,5,6,7,8,9 i = range(2:9) # Receberemos 2,3,4,5,6,7,8 j = range(0:15:2) # 0,2,4,6,8,10,12,14 # Sets k = set(2,3,4,2,3,4,5) # O resultado será k = 2,3,4,5 l = {'a', 'b', 'a'} # l = 'b' # Dicionários (todos esses dicionários são iguais) m = dict(one=1, two=2, three=3) n = {‘one’:1, ‘two’:2, ‘three’:3} o = dict(zip(‘two’, ‘three’, 1,2,3)) p = dict(1), (‘two’, 2), (‘three’, 3)) q = dict({‘one’:1, ‘two’:2, ‘three’:3}) Controle de Fluxo Os blocos de código que serão executados são definidos pela indentação, diferentemente de outras linguagens, onde se usa caracteres delimitadores. ''if, elif'' e else Assim como o if do C, é uma ferramente para decisão, bifurcação do código. Como em Python não tem switch case, a forma que se usou para se contornar isso foi usar a estrutura if, elif, elif, elif, ..., else. ''for'' Esse for é diferente do for do C, mas semelhante ao foreach do C++ e do C#. Se itera por toda uma lista (ou qualquer classe que se implemente a interface Iterable) fazendo operações com cada elemento da lista. Este laço de repetição pode possuir um else em seu final sendo que esse código será executado ao final de terminar toda a repetição por todos os elementos. ''while'' Enquanto a expressão que o segue for verdadeira, ele continuará a executar o seu bloco de código. Assim como em diversas outras linguagens. Palavras de controle reservadas Existem palavras reservadas muito utilizadas para controle de fluxo. break interrompe o laço mais interno que se está, como se tivesse chegado ao final de todas as iterações possíveis. continue é como o break com a diferença que ele interrompe somente a iteração atual, fazendo o laço ir para a próxima ignorando todo o resto do código. E pass não possue nenhuma funcionalidade. Ela é utilizada quando exige-se sintaticamente alguma linha de código mas o programa não o necessita. Erros e Exceções Python possue uma boa cobetura para tratamento de erros e exceções. Possue as ferramentas try ... catch ... else ... finallly, re-lançamento de erros/exceções e criação de seus próprios erros, desde que a classe criada herde de Exception. try: catch : else: finally: Orientação a Objeto Pode-se usar o conceito de orientação a objeto, utilizando-se de polimorfismo, herança, etc. class minhaClasse(mae1, mae2, mae3): a = 1 # atributo público. _a = 2 # atributo, por conveção, privado. __a = 3 # atributo, por conveção, privado. Renomeado para __A_a. # todas esses atributos acima são compartilhados por todos os # objetos que forem dessa mesma classe. def __init__(self,a): # construtor da classe (def é a palavra self.a = a # reservada para criação/definição de métodos) self.b = [] # atributo único de cada objeto criado. class mae1: # variáveis, construtores, etc def mandarFilho(ordem): print “Filho! Vai “ + ordem + “!” def mandarFilho(): print “Você ainda não foi?” Paralelismo Python tem um módulo threading que é uma implementação alto nível do módulo _thread e é utilizado para se trabalhar com threads e possue vários objetos específicos que facilitam o trabalho com threads em determinados casos. import time from threading import Thread def dorminhoco(id): print “Thread %d vai dormir por 5s.” % id time.sleep(5) print “Thread %d acordou.” % id for id in range(10): t = Thread(target=dorminhoco, args=(id,)) t.start() Operadores Alguns dos operadores mais utilizados: *Booleanos: and, or e not. *Bitwise: | (or), ^ (xor), & (and), << (shift left), >> (shift right), ~ (not). *Comparador: < (menor que), <= (menor ou igual), > (maior que), >= (maior ou igual), (igual), != (diferente) e is (idêntico). *Numéricos: + (soma), - (subtração), * (multiplicação), / (divisão), ** (exponenciação), // (divisão com resultado inteiro) e % (módulo). *Sequência: in (existência), + (concatenação), * (concatenação própria), i (idexação), i:j (fatiamento), i:j:k (fatiamento com espaçamento definido). Palavras Reservadas Segue uma tabela com todas as palavras reservadas de Python junto de sua breve explicação: Legibilidade Simplicidade Geral É fácil de usar e muito simples, possui um conjunto pequeno, mas expressivo de tipos primitivos (maior simplicidade) e as estruturas de controle e lógicas colaboram para o bom entendimento do código. Python, de forma geral é uma linguagem simples. Ortogonalidade Conjunto reduzido, mas completo de tipos primitivos e estruturas de controle. Além disso, Python, permite ligações entre tipos de dados diferentes, (checagem de tipo dinâmica). Possui uma boa ortogonalidade. Estrutura de controle São básicas e suficientes para solucionar a maioria dos problemas e englobam o tratamento de exceções. Isso influência na queda legibilidade, porém como a quantidade de estruturas de controle não são tão extensas, ela não é um fator tão decisivo. Estruturas de dados e construtores: Formam um conjunto pequeno, mas completo e possui tipo de dado objeto, que permite abstração. Por não precisar de declaração de variáveis a sua existência depende de uma expressão, o que pode prejudicar a interpretação do código. No conjunto, esses recursos afetam a legibilidade, entretanto não tornam a linguagem com baixa legibilidade. Sintaxe Tem restrição para a identificação de variáveis, possui restrição para palavras reservadas e sua semântica é consistente com seu contexto. Isso contribui para uma boa legibilidade. Analisando em um todo, o Python é uma linguagem com boa legibilidade. Capacidade de escrita Simplicidade e ortogonalidade Simplicidade dos tipos primitivos e possui uma boa ortogonalidade. Suporte à abstração Permite a abstração de processos com a criação de subprogramas e possui classes e objetos pré-construídos. Expressividade O fato de ser OO implica em ser extensível. Sintaxe Possui delimitadores e operadores. Todas esses características contribuem para uma boa capacidade de escrita. Confiabilidade Verificação de tipo Não tem declaração formal de tipos de variáveis e além disso, toda verificação é dinâmica o que prejudica a confiabilidade da linguagem. Tratamento de exceções Possui tratamento como visto acima. Locação de memória simultânea Permite a alocação de variável por referência. Legibilidade e capacidade de escrita Como ela possui uma boa legibilidade e capacidade de escrita isso afeta na sua confiabilidade, tornando mais vulnerável com relação ao surgimento de termos ambiguos. Apesar de Python ter tratamento de exceções e alocação de memória simultânea, ele possui uma baixa confiabilidade principalmente devido a sua verificação de tipo. Custo Treinamento Possui uma ampla comunidade de desenvolvedores, boa documentação e grande quantidade de exemplos e tutoriais. Desenvolvimento Sua legibilidade e capacidade de escrita influenciam no fácil desenvolvimento e manutenção. Compilação Gera byte code portável (interpretação híbrida). Execução Verificação de tipo durante o tempo de execução, a execução depende praticamente de quão rápido é o interpretador. Sistema de implementação Python é open source. Confiabilidade Possui alocação de variável por referência o que prejudica a confiabilidade do sistema. Manutenção Python possui boa legibilidade e é orientada a objetos o que facilita a manutenção do sistema já que o código também pode ser encapsulado. Com essas características python possui um baixo custo. Portabilidade Padronização CPython é padronização da implementação da linguagem. O que pode servir como referência para o desenvolvimento de programas. No entanto, a padronização do código não é tão forte e unificada como o java. Logo, python não possui muita portabilidade. Benchmarking O teste para o benchmarking foi feito em uma máquina Intel Core2 Duo T7500@2.20Ghz CPU; 2 GB RAM; OS Debian GNU/Linux 2.6.32 i686 a partir do seguinte código: Velocidade de python comparado a outras linguagens. !/user/bin/python3 -u import re import time import sys str = 'abcdefgh' + 'efghefgh' imax=1024/len(str)*1024*4 #4mb starttime=time.time(); print "exec.tm.sec\tstr.length" sys.stdout.flush(); gstr=' '; i = 0; while (i < imax + 1000): i = i + 1 gstr+= str gstr=re.sub( 'efgh', _____, 'gstr') lngth=len(str)*i if (lngth % (1024*256) 0): printf int(time.time()-starttime), "sec\t\t", (lngth/1024), "kb" sys.stdout.flush()